//引入模块
const crypto = require("crypto");

//创建md5算法
let hash = crypto.createHash('md5');

//首先，数据的单向加密
// let str1 = 'this is first';

//具体的加密
//例1
// hash.update(str1);  //其中，update可执行多次
// let encodeStr = hash.digest('hex');
// console.log(encodeStr.length); //32 //打印长度为十六进制的字符串

//例2 (将以上注释)

// let str2 = 'this is second this is second this is second this is second';
// hash.update(str2);
// let encodeStr2 = hash.digest('hex');
// console.log(encodeStr2.length); //32


//例3.1
let word = 'helloworldABC';
let str1 = 'hello';
let str2 = 'world';
let str3 = 'ABC';

// hash.update(word);
// console.log(hash.digest('hex'));  //eac844d277e158beacf5e1c163266c24

//例3.2（将3.1注释）

// hash.update(str1);
// hash.update(str2);
// hash.update(str3);
// console.log(hash.digest('hex'));    //分段加密结果与整体加密一致  eac844d277e158beacf5e1c163266c24



//加密函数（data:被加密的数据；key：密码）
function aesEncrypt (data, key) {
     /** 
        通过 crypto,与key 创建一个cipher(密码,暗号)
        algorithm 加密类型  
    */
    let cipher = crypto.createCipher('aes192', key);
    /**
     *     加密数据 （推荐
           update(
               data, 
           inputEncoding,   (输入的编码，即data的编码)   
           outputEncoding  （输出的编码，即hash十六进制的输出）
           )
           ）
     */

    let returnStr = cipher.update(data, 'utf-8', 'hex');
    //加入结尾符
    let final = cipher.final('hex');
    returnStr = returnStr + final;
    return returnStr;
}

console.log(aesEncrypt('hello','node'));//2e4b8d2a9628d56c371b3d2e1744345a


//解密函数

function aesDecrypt(encrypted, key) {
    //创建一个解密
    const decipher = crypto.createCipher('aes192', key);
    let descrped = decipher.update(encrypted, 'hex', 'utf-8');
    descrped += decipher.final('utf-8');
    return descrped;
}
let encrypted = '2e4b8d2a9628d56c371b3d2e1744345a';
let key = 'node';
console.log(aesDecrypt(encrypted, key));